package com.smart.community.commons.enums;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 费用计费方式枚举
 * 根据物业费计费方式调整权威标准声明定义
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Getter
@AllArgsConstructor
public enum FeeTypeEnum {
    
    /**
     * 按面积计费
     * 根据房屋面积和单价计算费用金额
     */
    AREA_BASED(0, "按面积计费"),
    
    /**
     * 固定费用
     * 直接使用固定金额，不依赖房屋面积
     */
    FIXED_AMOUNT(1, "固定费用");
    
    /**
     * 枚举值
     */
    @JsonValue
    private final Integer code;
    
    /**
     * 枚举描述
     */
    private final String description;
    
    /**
     * 根据code获取枚举
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    public static FeeTypeEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        
        for (FeeTypeEnum feeType : values()) {
            if (feeType.getCode().equals(code)) {
                return feeType;
            }
        }
        return null;
    }
    
    /**
     * 根据code获取描述
     * 
     * @param code 枚举值
     * @return 对应的描述，如果不存在则返回null
     */
    public static String getDescriptionByCode(Integer code) {
        FeeTypeEnum feeType = getByCode(code);
        return feeType != null ? feeType.getDescription() : null;
    }
    
    /**
     * 判断是否为按面积计费
     * 
     * @param code 枚举值
     * @return true-按面积计费，false-其他
     */
    public static boolean isAreaBased(Integer code) {
        return AREA_BASED.getCode().equals(code);
    }
    
    /**
     * 判断是否为固定费用
     * 
     * @param code 枚举值
     * @return true-固定费用，false-其他
     */
    public static boolean isFixedAmount(Integer code) {
        return FIXED_AMOUNT.getCode().equals(code);
    }
    
    /**
     * Jackson反序列化方法
     * 严格遵循《系统状态枚举权威标准声明.md》规范
     * 
     * @param code 枚举值
     * @return 对应的枚举，如果不存在则返回null
     */
    @JsonCreator
    public static FeeTypeEnum fromCode(Integer code) {
        return getByCode(code);
    }
} 